﻿//----------------------------------------------------------------
// Desc:
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2010-06-11
//
// Update Date :
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


//----------------------------------------------------------------
// 输入事件类型表（及该事件的参数类型、参数说明）
//----------------------------------------------------------------
enum EF_INPUT_TYPE
{
    eIT_UNKNOWN             = 0x100,    // 错误消息

    eIT_LBUTTON_DOWN,                   // 鼠标左键按下（p2:VEC2:鼠标位置）
    eIT_LBUTTON_UP,                     // 鼠标左键弹起（p2:VEC2:鼠标位置）
    eIT_LBUTTON_DBCLICK,                // 鼠标左键双击（p2:VEC2:鼠标位置）

    eIT_MBUTTON_DOWN,                   // 鼠标中键按下（p2:VEC2:鼠标位置）
    eIT_MBUTTON_UP,                     // 鼠标中键弹起（p2:VEC2:鼠标位置）
    eIT_MBUTTON_DBCLICK,                // 鼠标中键双击（p2:VEC2:鼠标位置）

    eIT_RBUTTON_DOWN,                   // 鼠标右键按下（p2:VEC2:鼠标位置）
    eIT_RBUTTON_UP,                     // 鼠标右键弹起（p2:VEC2:鼠标位置）
    eIT_RBUTTON_DBCLICK,                // 鼠标右键双击（p2:VEC2:鼠标位置）

    eIT_MOUSEMOVE,                      // 鼠标移动（p2:VEC2:鼠标位置）
    eIT_MOUSEWHEEL,                     // 滚轮变化（p1:bool:是否是向上滚，p2:VEC2:鼠标位置）

    eIT_KEYDOWN,                        // 按键按下（p1:UINT:虚拟键码）
    eIT_KEYUP,                          // 按键弹起（p1:UINT:虚拟键码）
    eIT_CHAR,                           // 字符输入（p1:UINT:字符码）

    eIT_ACTIVATE,                       // 进程活动状态变化（p1:bool:当前进程活动状态）
    eIT_SETCURSOR,                      // 设置鼠标状态（无参）

    eIT_USER                = 0x800,    // 用户消息开始

    EF_INPUT_TYPE_FORCE = 0xffffffff,
};

//----------------------------------------------------------------
// 输入事件包
//----------------------------------------------------------------
#pragma pack(push, 1)
struct FINPUT_PACKAGE
{
    EF_INPUT_TYPE nType;                // 类型
    FDT_VALUE p1;                       // 参数1
    FDT_VALUE p2;                       // 参数2
};
#pragma pack(pop)


//----------------------------------------------------------------
// 输入处理
//----------------------------------------------------------------
// 事件翻译，并转换为输入事件包
// .ipk 输出结果
// .return 返回是否有事件被翻译为 Fuel4D 输入事件
#if FUEL_OS_WINDOWS
#define F_GET_X(lp)  ((int)(short)LOWORD(lp))
#define F_GET_Y(lp)  ((int)(short)HIWORD(lp))
#define F_GET_XF(lp) ((float)(short)LOWORD(lp))
#define F_GET_YF(lp) ((float)(short)HIWORD(lp))
#define F_GET_WHEEL_DELTA(wp) ((short)HIWORD(wp))
FINLINE bool FInputTransmit_windows(FINPUT_PACKAGE& ipk, UINT msg, WPARAM wparam, LPARAM lparam);
// windows虚拟键转为 Fuel4D 虚拟键
// .return EF_INPUT_VIRTUAL_KEY之一
#elif FUEL_OS_ANDROID
FINLINE bool FInputTransmit_android_motion(FINPUT_PACKAGE& ipk, struct android_app* app, AInputEvent* event, float& ox, float& oy);
FINLINE bool FInputTransmit_android_key(FINPUT_PACKAGE& ipk, struct android_app* app, AInputEvent* event);
#elif FUEL_OS_IOS
#endif


//----------------------------------------------------------------
//
//----------------------------------------------------------------
#include "FBsc_InputVK.h"
#include "FBsc_Input_inl.h"